const {
  carouselInformationList,
  popularActivityList
} = require('../../api/home');
const {
  filePreview,
  studentGet,
  getAccessToken,
  getBase64
} = require('../../api/index');
const {
  isFinished,
  sliceString,
  joinBase64,
  readFile
} = require('../../utils/util');
const {
  wxLogin,
  getCode
} = require('../../api/login');

// pages/home/index.js
Page({
  /*** 页面的初始数据 */
  data: {
    modelShow: false,
    showCover: false,
    model: null,
    page: {
      pageNumber: 1,
      pageSize: 20
    },
    total: 0, //  总条数
    finished: false,
    loading: false,
    dataList: [],
    swiperList: [],
    hotActiveList: []
  },
  onJump(event) {
    const {
      url
    } = event.currentTarget.dataset;
    wx.navigateTo({
      url
    });
  },
  async onRefresh() {
    wx.showLoading({ title: '加载中...' });
    this.data.swiperList = [];
    this.data.hotActiveList = [];
    this.data.page.pageNumber = 1;
    this.data.finished = false;
    await Promise.all([ 
      fetchCarouselInformationList.call(this),
      fetchPopularActivityList.call(this)
    ]);
    wx.hideLoading();
  },
  loadMore() { //  加载更多
    fetchPopularActivityList.call(this);
  },
  //  点击遮盖层，判断用户是否注册过
  onClickCover() {
    const model = this.data.model;
    model.show();
  },
  /*** 生命周期函数--监听页面加载 */
  async onLoad(options) {
    wx.getSetting({ // getSetting方法用来获取小程序向用户请求过的权限
      withSubscriptions: true, // 这个字段为true时，用来获取用户订阅消息的订阅状态
      success (res) {
        // 我们需要判断的是res.subscriptionsSetting.itemSettings这个字段
        // 假设你的模板id为"abcd"，itemSettings里，如果没有名为abcd的属性，表明用户还未订阅过消息
        // 如果有名为adcd的属性，且属性值为reject，表明用户拒绝订阅该消息
        // 如果有名为abcd的属性，且属性值为accept，表明用户已接受该订阅消息
        console.log(res)
      }
    })
    

    wx.showLoading({ title: '加载中...' });
    //  清除用户所有信息
    wx.clearStorageSync();

    getAccessToken();
    this.data.model = this.selectComponent('#model');
    //  登录，主要是获取 openid 然后 确定用户是否登录过
    isLogin.call(this);
    await  Promise.all([ 
      fetchCarouselInformationList.call(this),
      fetchPopularActivityList.call(this)
    ]);
    wx.hideLoading();
  },

  /*** 生命周期函数--监听页面初次渲染完成 */
  onShow() {
    const studentid = wx.getStorageSync('studentid');
    if(studentid) this.setData({ 
      showCover: false,
      modelShow: false 
    });
  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})

//  判断是否需要注册
function isRegister() {
  //  查看 缓存中是否有 userInfo，如果有说明注册过了，就不需要在进行重新注册了
  const studentid = wx.getStorageSync('studentid');

  if (studentid) { //  已注册
    this.setData({ showCover: false });
  } else { //  未注册
    this.setData({ showCover: true });
  }
}

async function isLogin() {
  const isToken = wx.getStorageSync('token');
  const isOpenid = wx.getStorageSync('openid');

  //  每一次进入都更新一下缓存的 userInfo 让其保持 最新的状态

  if (isToken && isOpenid) {
    //  每次进入保持最新的缓存
    return fetchStudentGet.call(this, isOpenid);;
  };

  //  进行登录获取 code
  const wxCode = await getCode();
  const {
    result,
    errors = []
  } = await wxLogin({
    jsCode: wxCode
  });

  //  有错误
  if (errors.length > 0) { // 显示错误
    return;
  }

  //  缓存数据
  wx.setStorageSync('openid', result.openid);
  wx.setStorageSync('session_key', result.session_key);

  //  获取用户信息 判断是否之前已经注册
  fetchStudentGet.call(this, result.openid);
}

//  获取用户信息
async function fetchStudentGet(openId) {
  const {
    errors,
    student,
    token
  } = await studentGet({
    openId
  });
  if (errors.lenght > 0) {
    return;
  }

  //  判断是否注册过  - 注册弹窗开关
  if (!student) {
    isRegister.call(this);
    return;
  }

  const res = await getBase64(student.avatar);
  student.avatar = joinBase64(res);
  wx.setStorageSync('userInfo', student); // 每次进入获取最新的信息
  wx.setStorageSync('studentid', student.id);
  wx.setStorageSync('token', token); //  这个token 是为了数据可以正常访问
}

//   获取轮播图数据
async function fetchCarouselInformationList() {
  const {
    errors,
    result
  } = await carouselInformationList();
  if (errors.lenght > 0) {
    console.log('home');
    return;
  }
  this.setData({
    swiperList: setResult(result)
  });
}

//  获取 热门活动列表数据
async function fetchPopularActivityList() {
  wx.showLoading({
    title: '加载中...'
  });
  const {
    errors,
    result,
    totalCount
  } = await popularActivityList(this.data.page);
  if (errors.lenght > 0) {
    return;
  }

  //  判断数据是不是都已经加载完了
  this.setData({
    finished: isFinished(totalCount, this.data.page.pageNumber * this.data.page.pageSize)
  });
  //  加载更多数据
  this.setData({
    hotActiveList: this.data.hotActiveList.concat(setResult2(result))
  });
  this.data.page.pageNumber++;

  wx.hideLoading();
}

//  处理数据
function setResult(data = []) {
  const _data = JSON.parse(JSON.stringify(data));

  _data.map(item => {
    item.carouselPhoto = filePreview('/file/preview/' + item.carouselPhoto);

    return item;
  })

  return _data;
}

//  处理数据
function setResult2(data = []) {
  const _data = JSON.parse(JSON.stringify(data));

  _data.map(item => {
    item.activityPhoto = filePreview('/file/preview/' + item.activityPhoto);
    item.subtitle = sliceString(item.subtitle || '', 14);
    return item;
  })

  return _data;
}